"""
整个系统的主入口，负责整个解析器的构建和运行。
"""

import os
import abstract_decoder
import ook_decoder
import brainfuck_decoder
import caesar_decoder
import crypto_hex_decoder
import base_decoder
import time


def build_decoder_group():
    """
    构建所有的解码器组
    """
    group = abstract_decoder.DecoderGroup()
    group.add_decoder(ook_decoder.OokDecoder())
    group.add_decoder(brainfuck_decoder.BrainfuckDecoder())
    group.add_decoder(caesar_decoder.CaesarDecoder())
    group.add_decoder(crypto_hex_decoder.CryptoHexDecoder())
    group.add_decoder(base_decoder.BaseDecoder())
    return group


def test_all_files(dir_path="test-data", key=None):
    """
    测试文件夹下所有文件
    """
    group = build_decoder_group()
    # 获取test-data目录下所有文件
    files = [
        f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))
    ]
    for file in files:
        # 解码文件
        data = group.decode_file(os.path.join(dir_path, file), key)
        log_process(f"测试文件：{file}，解码结果：{data}")


def print_help():
    """
    打印帮助信息
    """
    print("帮助信息")
    print("测试test-data文件夹下所有文件：dir [dir_path]")
    print("解码指定文件：file [file_path]")
    print("解码文本：code [text]")
    print("退出程序：exit")


def main():
    """
    主函数
    """
    # 构建解析器
    group = build_decoder_group()
    cmd, key = get_command()
    while cmd[0] != "exit":
        if cmd[0] == "dir":
            # 测试指定目录下所有文件
            test_all_files(cmd[1], key)
        elif cmd[0] == "file":
            # 解码指定文件
            data = group.decode_file(cmd[1], key)
            log_process(f"解码文件：{cmd[1]}，解码结果：{data}")
        elif cmd[0] == "code":
            # 解码文本
            data = group.decode(cmd[1], key)
            log_process(f"解码文本：{cmd[1]}，解码结果：{data}")
        else:
            print("命令错误，请输入正确命令")
        if cmd[0] != "exit":
            cmd = get_command()
         
log_file = f"log/{time.strftime('%Y-%m-%d')}.txt"
def log_process(msg):
    """
    日志记录
    """
    print(msg)
    #检查日志文件夹是否存在，不存在则创建
    if not os.path.exists("log"):
        os.makedirs("log")
    # 记录日志
    with open(log_file, "a") as f:
        f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}:{msg}\n")

def get_command():
    print_help()
    cmd = input("请输入命令：").strip()
    key = input("请输入密钥（可选）：").strip()
    return cmd.split(" "), key


if __name__ == "__main__":
    # 测试指定的指定文件
    main()
